package com.pro.config;

import com.pro.utils.SecurityPasswordEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.PasswordEncoder;

///**
// * @author ：刘弘禹
// * @description：TODO
// * @date ： 2022/1/9 15:11
// */

@Configuration
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()          // 定义当需要用户登录时候，转到的登录页面。
                .usernameParameter("account")//设置用户名参数名
                .passwordParameter("password")//设置用户密码参数名
                .loginPage("/login/login.html")      // 设置登录页面
                .loginProcessingUrl("/login/login") // 自定义的登录接口
                /*.successForwardUrl("/login/login")
                .failureUrl("/login/login.html")*/
                .defaultSuccessUrl("/index.html",true)
                .and()
                .authorizeRequests()    // 定义哪些URL需要被保护、哪些不需要被保护
                .antMatchers("/login/login.html","/login","/login/login","/login/getVerify","/login/getVerification").permitAll() // 设置所有人都可以访问登录页面
                .antMatchers("/**/*.css","/layui/**").permitAll()//放行css文件
                .antMatchers("/**/*.js","/layui/**").permitAll()//放行js文件
                .anyRequest()// 任何请求,登录后可以访问
                .authenticated()
                .and()
                .csrf().disable();// 关闭csrf防护

        http.logout()
                .invalidateHttpSession(true)//清空session
                .clearAuthentication(true)//清空security记录
                .logoutSuccessUrl("/")//退出登录请求
                .logoutUrl("/login//logOut");//退出登录

        //设置页面中iframe可以访问
        http.headers().frameOptions().sameOrigin();
    }

    /**
     * 注入加密方式
     * @return
     */
    @Bean
    public PasswordEncoder passwordEncoder(){
        //注入加密
        return new SecurityPasswordEncoder();
    }
}
